home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Utilities / Interfaces / SIHelper.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  27.0 KB  |  704 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        SIHelper.h
  3.  
  4.     Contains:    Interface to an implementation of the ODCPlusSemanticInterface
  5.                 helper class.
  6.  
  7.     Owned by:    Nick Pilch
  8.  
  9.     Copyright:    © 1993 - 1995 by Apple Computer, Inc., all rights reserved.
  10.  
  11.     
  12. */
  13.  
  14. #ifndef _SIHELPER_
  15. #define _SIHELPER_
  16.  
  17.  
  18. #ifndef _SIHLPABS_
  19. #include "SIHlpAbs.h"
  20. #endif
  21.  
  22. #ifndef __MIXEDMODE__
  23. #include <MixedMode.h>
  24. #endif
  25.  
  26. #ifdef USESROUTINEDESCRIPTORS
  27.     #define SIHELPER_USESROUTINEDESCRIPTORS 1    // use routine descriptors
  28. #else
  29.     #define SIHELPER_USESROUTINEDESCRIPTORS 0
  30. #endif
  31.  
  32.  
  33. //==============================================================================
  34. // Constants
  35. //==============================================================================
  36.  
  37. #define kODStandardDispatch    0
  38. #define kODAlwaysForward    1
  39.  
  40. //==============================================================================
  41. // Functions
  42. //==============================================================================
  43. #if 0
  44. ODDescType GetTokenDescType(ODOSLToken* token);
  45. void SetTokenDescType(ODOSLToken* token, ODDescType type);
  46. ODHandle GetTokenDataHandle(ODOSLToken* token);
  47. void SetTokenDataHandle(ODOSLToken* token, ODHandle handle);
  48. #endif /* 0 */
  49.  
  50. //==============================================================================
  51. // Classes defined in this interface
  52. //==============================================================================
  53.  
  54. class    SIHelper;
  55. class    SIHashTable;
  56.  
  57. //==============================================================================
  58. // Classes used by this interface
  59. //==============================================================================
  60.  
  61. class    ODPart;
  62. class    ODSemanticInterface;
  63. class    ODSession;
  64. class    ODNameResolver;
  65.  
  66. //==============================================================================
  67. // Callback function mixed-mode glue.
  68. //==============================================================================
  69.  
  70. #ifndef GetCurrentArchitecture
  71.     // The pre-68k universal headers use GetCurrentISA; the newer headers that
  72.     // support CFM68k use GetCurrentArchitecture. This lets us compile either way:
  73.     #define GetCurrentArchitecture() GetCurrentISA()
  74. #endif
  75.  
  76. #if SIHELPER_USESROUTINEDESCRIPTORS
  77. typedef UniversalProcPtr ODEventHandlerUPP ;
  78. typedef UniversalProcPtr ODDescCoercionHandlerUPP ;
  79. typedef UniversalProcPtr ODPtrCoercionHandlerUPP ;
  80. typedef UniversalProcPtr ODCoercionHandlerUPP;
  81. typedef UniversalProcPtr ODObjectAccessorUPP;
  82. typedef UniversalProcPtr ODCompareUPP;
  83. typedef UniversalProcPtr ODCountUPP ;
  84. typedef UniversalProcPtr ODDisposeTokenUPP ;
  85. typedef UniversalProcPtr ODGetMarkTokenUPP ;
  86. typedef UniversalProcPtr ODMarkUPP ;
  87. typedef UniversalProcPtr ODAdjustMarksUPP ;
  88. typedef UniversalProcPtr ODGetErrDescUPP ;
  89. typedef UniversalProcPtr ODPreDispatchUPP ;
  90. typedef UniversalProcPtr ODTokenInquiryUPP ;
  91. typedef UniversalProcPtr ODSpecialHandlerUPP;
  92. #else    /* if not SIHELPER_USESROUTINEDESCRIPTORS */
  93.  
  94. typedef pascal ODError (*ODEventHandlerProcPtr)(ODPart*        thePart,
  95.                                             ODAppleEvent*    theODAppleEvent,
  96.                                             ODAppleEvent*    reply,
  97.                                             ODSLong    handlerRefcon);
  98.  
  99. typedef pascal ODError (*ODCoercionHandler)();
  100.  
  101. typedef pascal ODError (*ODDescCoercionHandler)(ODPart*        thePart,
  102.                                             ODDesc*        theODDesc,
  103.                                             ODDescType    toType,
  104.                                             ODSLong    handlerRefCon,
  105.                                             ODDesc*        result);
  106.  
  107. typedef pascal ODError (*ODPtrCoercionHandler)(ODPart*        thePart,
  108.                                             ODDescType    typeCode,
  109.                                             ODPtr        dataPtr,
  110.                                             ODSize        dataSize,
  111.                                             ODDescType    toType,
  112.                                             ODSLong    handlerRefCon,
  113.                                             ODDesc*        result);
  114.  
  115. typedef pascal ODError (*ODAccessorProcPtr)(ODPart*                thePart,
  116.                                         ODDescType            desiredClass,
  117.                                         ODOSLToken*        container,
  118.                                         ODDescType            containerClass,
  119.                                         ODDescType            form,
  120.                                         ODDesc*                selectionData,
  121.                                         ODOSLToken*        value,
  122.                                         ODSLong            handlerRefCon);
  123.  
  124. typedef pascal ODError (*ODCompareProcPtr)(ODPart*                thePart,
  125.                                         ODDescType            oper,
  126.                                         ODOSLToken*        obj1,
  127.                                         ODOSLToken*        obj2,
  128.                                         ODBoolean*            result,
  129.                                         ODSLong            refCon);
  130.  
  131. typedef pascal ODError (*ODCountProcPtr)(ODPart*            thePart,
  132.                                     ODDescType            desiredType,
  133.                                     ODDescType            containerClass,
  134.                                     ODOSLToken*        container,
  135.                                     ODSLong*            result,
  136.                                     ODSLong            refCon);
  137.  
  138. typedef pascal ODError (*ODDisposeTokenProcPtr)(ODPart*            thePart,
  139.                                             ODOSLToken*    unneededToken,
  140.                                             ODSLong        refCon);
  141.  
  142. typedef pascal ODError (*ODGetErrDescProcPtr)(ODPart*        thePart,
  143.                                             ODDesc**    errDesc,
  144.                                             ODSLong    refCon);
  145.  
  146. typedef pascal ODError (*ODGetMarkTokenProcPtr)(ODPart*                thePart,
  147.                                             ODOSLToken*        dContainerToken,
  148.                                             ODDescType            containerClass,
  149.                                             ODOSLToken*        result,
  150.                                             ODSLong            refCon);
  151.  
  152. typedef pascal ODError (*ODMarkProcPtr)(ODPart*                thePart,
  153.                                     ODOSLToken*        dToken,
  154.                                     ODOSLToken*        markToken,
  155.                                     ODSLong            index,
  156.                                     ODSLong            refCon);
  157.  
  158. typedef pascal ODError (*ODAdjustMarksProcPtr)(ODPart*                thePart,
  159.                                             ODSLong            newStart,
  160.                                             ODSLong            newStop,
  161.                                             ODOSLToken*        markToken,
  162.                                             ODSLong            refCon);
  163.  
  164. typedef pascal ODError (*ODPreDispatchProcPtr)(ODPart*        thePart,
  165.                                                 ODAppleEvent*    theODAppleEvent,
  166.                                                 ODAppleEvent*    reply,
  167.                                                 ODSLong    handlerRefcon);
  168.  
  169. typedef pascal ODError (*ODSpecialHandlerPtr)();
  170.  
  171. typedef pascal ODPart* (*ODTokenInquiryProcPtr)(ODOSLToken*    token,
  172.                                             ODSLong        refCon);
  173.  
  174. typedef ODEventHandlerProcPtr ODEventHandlerUPP ;
  175. typedef ODDescCoercionHandler ODDescCoercionHandlerUPP ;
  176. typedef ODPtrCoercionHandler ODPtrCoercionHandlerUPP ;
  177. typedef ODCoercionHandler ODCoercionHandlerUPP;
  178. typedef ODAccessorProcPtr ODObjectAccessorUPP ;
  179. typedef ODCompareProcPtr ODCompareUPP;
  180. typedef ODCountProcPtr ODCountUPP ;
  181. typedef ODGetMarkTokenProcPtr ODGetMarkTokenUPP ;
  182. typedef ODMarkProcPtr ODMarkUPP ;
  183. typedef ODAdjustMarksProcPtr ODAdjustMarksUPP ;
  184. typedef ODDisposeTokenProcPtr ODDisposeTokenUPP ;
  185. typedef ODGetErrDescProcPtr ODGetErrDescUPP ;
  186. typedef ODPreDispatchProcPtr ODPreDispatchUPP ;
  187. typedef ODTokenInquiryProcPtr ODTokenInquiryUPP ;
  188. typedef ODSpecialHandlerPtr ODSpecialHandlerUPP ;
  189.  
  190. #endif        /* SIHELPER_USESROUTINEDESCRIPTORS */
  191.  
  192. #if SIHELPER_USESROUTINEDESCRIPTORS
  193. enum {
  194.     uppODEventHandlerProcInfo = kPascalStackBased
  195.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  196.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  197.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODAppleEvent*)))
  198.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODAppleEvent*)))
  199.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODSLong)))
  200. };
  201.  
  202. enum {
  203.     uppODDescCoercionHandlerProcInfo = kPascalStackBased
  204.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  205.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  206.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODDesc*)))
  207.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODDescType)))
  208.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODSLong)))
  209.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODDesc*)))
  210. };
  211.  
  212. enum {
  213.     uppODPtrCoercionHandlerProcInfo = kPascalStackBased
  214.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  215.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  216.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODDescType)))
  217.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(void*)))
  218.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(long)))
  219.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODDescType)))
  220.          | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(long)))
  221.          | STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(ODDesc*)))
  222. };
  223.  
  224. enum {
  225.     uppODObjectAccessorProcInfo = kPascalStackBased
  226.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  227.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  228.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODDescType)))
  229.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODDesc*)))
  230.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODDescType)))
  231.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODDescType)))
  232.          | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(ODDesc*)))
  233.          | STACK_ROUTINE_PARAMETER(7, SIZE_CODE(sizeof(ODOSLToken*)))
  234.          | STACK_ROUTINE_PARAMETER(8, SIZE_CODE(sizeof(ODSLong)))
  235. };
  236.  
  237. enum {
  238.     uppODCompareProcInfo = kPascalStackBased
  239.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  240.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  241.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODDescType)))
  242.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODOSLToken*)))
  243.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODOSLToken*)))
  244.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODBoolean*)))
  245.          | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(ODSLong)))
  246. };
  247.  
  248. enum {
  249.     uppODCountProcInfo = kPascalStackBased
  250.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  251.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  252.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODDescType)))
  253.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODDescType)))
  254.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODOSLToken*)))
  255.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODSLong*)))
  256.          | STACK_ROUTINE_PARAMETER(6, SIZE_CODE(sizeof(ODSLong)))
  257. };
  258.  
  259. enum {
  260.     uppODDisposeTokenProcInfo = kPascalStackBased
  261.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  262.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  263.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODOSLToken*)))
  264.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODSLong)))
  265. };
  266.  
  267. enum {
  268.     uppODGetMarkTokenProcInfo = kPascalStackBased
  269.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  270.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  271.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODOSLToken*)))
  272.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODDescType)))
  273.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODOSLToken*)))
  274.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODSLong)))
  275. };
  276.  
  277. enum {
  278.     uppODGetErrDescProcInfo = kPascalStackBased
  279.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  280.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  281.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODDesc**)))
  282.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODSLong)))
  283. };
  284.  
  285. enum {
  286.     uppODMarkProcInfo = kPascalStackBased
  287.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  288.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  289.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODOSLToken*)))
  290.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODOSLToken*)))
  291.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODSLong)))
  292.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODSLong)))
  293. };
  294.  
  295. enum {
  296.     uppODAdjustMarksProcInfo = kPascalStackBased
  297.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  298.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  299.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODSLong)))
  300.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODSLong)))
  301.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODOSLToken*)))
  302.          | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(ODSLong)))
  303. };
  304.  
  305. enum {
  306.     uppODPreDispatchProcInfo = kPascalStackBased
  307.          | RESULT_SIZE(SIZE_CODE(sizeof(ODError)))
  308.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODPart*)))
  309.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODAppleEvent*)))
  310.          | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(ODAppleEvent*)))
  311.          | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ODSLong)))
  312. };
  313.  
  314. enum {
  315.     uppODTokenInquiryProcInfo = kPascalStackBased
  316.          | RESULT_SIZE(SIZE_CODE(sizeof(ODPart*)))
  317.          | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(ODOSLToken*)))
  318.          | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(ODSLong)))
  319. };
  320.  
  321. #define CallODEventHandlerProc(userRoutine, thePart, theODAppleEvent, reply, handlerRefcon)        \
  322.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODEventHandlerProcInfo, (thePart), (theODAppleEvent), (reply), (handlerRefcon))
  323. #define NewODEventHandlerProc( theHandlerProc )                                \
  324.     (ODEventHandlerUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),    \
  325.             uppODEventHandlerProcInfo, GetCurrentArchitecture() )
  326.  
  327. #define CallODDescCoercionHandlerProc(userRoutine, thePart, theODDesc, toType, handlerRefCon, result)        \
  328.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODDescCoercionHandlerProcInfo, (thePart), (theODDesc), (toType), (handlerRefCon), (result))
  329. #define NewODDescCoercionHandlerProc( theHandlerProc )                            \
  330.     (ODDescCoercionHandlerUPP) NewRoutineDescriptor(                        \
  331.             (ProcPtr)(theHandlerProc),                                        \
  332.             uppODDescCoercionHandlerProcInfo, GetCurrentArchitecture() )
  333.  
  334. #define CallODPtrCoercionHandlerProc(userRoutine, thePart, typeCode, dataPtr, dataSize, toType, handlerRefCon, result)        \
  335.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODPtrCoercionHandlerProcInfo, (thePart), (typeCode), (dataPtr), (dataSize), (toType), (handlerRefCon), (result))
  336. #define NewODPtrCoercionHandlerProc( theHandlerProc )                            \
  337.     (ODPtrCoercionHandlerUPP) NewRoutineDescriptor(                        \
  338.             (ProcPtr)(theHandlerProc),                                        \
  339.             uppODPtrCoercionHandlerProcInfo, GetCurrentArchitecture() )
  340.  
  341.  
  342. #define CallODObjectAccessorProc(userRoutine, thePart, desiredClass, container, containerClass, form, selectionData, value, handlerRefCon)        \
  343.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODObjectAccessorProcInfo, (thePart), (desiredClass), (container), (containerClass), (form), (selectionData), (value), (handlerRefCon))
  344. #define NewODObjectAccessorProc( theAccessorProc )                                \
  345.     (ODObjectAccessorUPP) NewRoutineDescriptor( (ProcPtr)(theAccessorProc),\
  346.             uppODObjectAccessorProcInfo, GetCurrentArchitecture() )
  347.  
  348. #define CallODCompareProc(userRoutine, thePart, oper, obj1, obj2, result, refCon)        \
  349.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODCompareProcInfo, (thePart), (oper), (obj1), (obj2), (result), (refCon))
  350. #define NewODCompareProc( theHandlerProc )                                        \
  351.     (ODCompareUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),        \
  352.             uppODCompareProcInfo, GetCurrentArchitecture() )
  353.  
  354. #define CallODCountProc(userRoutine, thePart, desiredType, containerClass, container, result, refCon)        \
  355.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODCountProcInfo, (thePart), (desiredType), (containerClass), (container), (result), (refCon))
  356. #define NewODCountProc( theHandlerProc )                                        \
  357.     (ODCountUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),            \
  358.             uppODCountProcInfo, GetCurrentArchitecture() )
  359.  
  360. #define CallODDisposeTokenProc(userRoutine, thePart, unneededToken, refCon)        \
  361.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODDisposeTokenProcInfo, (thePart), (unneededToken), (refCon))
  362. #define NewODDisposeTokenProc( theHandlerProc )                                \
  363.     (ODDisposeTokenUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),    \
  364.             uppODDisposeTokenProcInfo, GetCurrentArchitecture() )
  365.  
  366. #define CallODGetMarkTokenProc(userRoutine, thePart, dContainerToken, containerClass, result, refCon)        \
  367.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODGetMarkTokenProcInfo, (thePart), (dContainerToken), (containerClass), (result), (refCon))
  368. #define NewODGetMarkTokenProc( theHandlerProc )                                \
  369.     (ODGetMarkTokenUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),    \
  370.             uppODGetMarkTokenProcInfo, GetCurrentArchitecture() )
  371.  
  372. #define CallODMarkProc(userRoutine, thePart, dToken, markToken, index, refCon)        \
  373.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODMarkProcInfo, (thePart), (dToken), (markToken), (index), (refCon))
  374. #define NewODMarkProc( theHandlerProc )                                        \
  375.     (ODMarkUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),            \
  376.             uppODMarkProcInfo, GetCurrentArchitecture() )
  377.  
  378. #define CallODAdjustMarksProc(userRoutine, thePart, newStart, newStop, markToken, refCon)        \
  379.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODAdjustMarksProcInfo, (thePart), (newStart), (newStop), (markToken), (refCon))
  380. #define NewODAdjustMarksProc( theHandlerProc )                                    \
  381.     (ODAdjustMarksUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),    \
  382.             uppODAdjustMarksProcInfo, GetCurrentArchitecture() )
  383.  
  384. #define CallODGetErrDescProc(userRoutine, thePart, errDesc, refCon)        \
  385.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODGetErrDescProcInfo, (thePart), (errDesc), (refCon))
  386. #define NewODGetErrDescProc( theHandlerProc )                                    \
  387.     (ODGetErrDescUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),    \
  388.             uppODGetErrDescProcInfo, GetCurrentArchitecture() )
  389.  
  390. #define CallODPreDispatchProc(userRoutine, thePart, theODAppleEvent, reply, handlerRefcon)        \
  391.         CallUniversalProc((UniversalProcPtr)(userRoutine), uppODPreDispatchProcInfo, (thePart), (theODAppleEvent), (reply), (handlerRefcon))
  392. #define NewODPreDispatchProc( theHandlerProc )                                \
  393.     (ODPreDispatchUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),    \
  394.             uppODPreDispatchProcInfo, GetCurrentArchitecture() )
  395.  
  396. #define CallODTokenInquiryProc(userRoutine, token, refCon)        \
  397.         (ODPart*)CallUniversalProc((UniversalProcPtr)(userRoutine), uppODTokenInquiryProcInfo, (token), (refCon))
  398. #define NewODTokenInquiryProc( theHandlerProc )                                \
  399.     (ODTokenInquiryUPP) NewRoutineDescriptor( (ProcPtr)(theHandlerProc),    \
  400.             uppODTokenInquiryProcInfo, GetCurrentArchitecture() )
  401.  
  402. #else    /* if not SIHELPER_USESROUTINEDESCRIPTORS */
  403.  
  404. #define CallODEventHandlerProc(userRoutine, thePart, theODAppleEvent, reply, handlerRefcon)        \
  405.         (*(userRoutine))((thePart), (theODAppleEvent), (reply), (handlerRefcon))
  406. #define NewODEventHandlerProc(theHandlerProc)                                    \
  407.         (ODEventHandlerUPP)(theHandlerProc)
  408.  
  409. #define CallODObjectAccessorProc(userRoutine, thePart, desiredClass, container, containerClass, form, selectionData, value, handlerRefCon)        \
  410.         (*(userRoutine))((thePart), (desiredClass), (container), (containerClass), (form), (selectionData), (value), (handlerRefCon))
  411. #define NewODObjectAccessorProc(theAccessorProc)                                \
  412.         (ODObjectAccessorUPP)(theAccessorProc)
  413.  
  414. #define CallODCompareProc(userRoutine, thePart, oper, obj1, obj2, result, refCon)        \
  415.         (*(userRoutine))((thePart), (oper), (obj1), (obj2), (result), (refCon))
  416. #define NewODCompareProc(theAccessorProc)                                        \
  417.         (ODCompareUPP)(theAccessorProc)
  418.  
  419. #define CallODCountProc(userRoutine, thePart, desiredType, containerClass, container, result, refCon)        \
  420.         (*(userRoutine))((thePart), (desiredType), (containerClass), (container), (result), (refCon))
  421. #define NewODCountProc(theAccessorProc)                                        \
  422.         (ODCountUPP)(theAccessorProc)
  423.  
  424. #define CallODGetMarkTokenProc(userRoutine, thePart, dContainerToken, containerClass, result, refCon)        \
  425.         (*(userRoutine))((thePart), (dContainerToken), (containerClass), (result), (refCon))
  426. #define NewODGetMarkTokenProc(theAccessorProc)                                    \
  427.         (ODGetMarkTokenUPP)(theAccessorProc)
  428.  
  429. #define CallODMarkProc(userRoutine, thePart, dToken, markToken, index, refCon)        \
  430.         (*(userRoutine))((thePart), (dToken), (markToken), (index), (refCon))
  431. #define NewODMarkProc(theAccessorProc)                                            \
  432.         (ODMarkUPP)(theAccessorProc)
  433.  
  434. #define CallODAdjustMarksProc(userRoutine, thePart, newStart, newStop, markToken, refCon)        \
  435.         (*(userRoutine))((thePart), (newStart), (newStop), (markToken), (refCon))
  436. #define NewODAdjustMarksProc(theAccessorProc)                                    \
  437.         (ODAdjustMarksUPP)(theAccessorProc)
  438.  
  439. #define CallODDisposeTokenProc(userRoutine, thePart, unneededToken, refCon)        \
  440.         (*(userRoutine))((thePart), (unneededToken), (refCon))
  441. #define NewODDisposeTokenProc(theAccessorProc)                                    \
  442.         (ODDisposeTokenUPP)(theAccessorProc)
  443.  
  444. #define CallODGetErrDescProc(userRoutine, thePart, errDesc, refCon)        \
  445.         (*(userRoutine))((thePart), (errDesc), (refCon))
  446. #define NewODGetErrDescProc(theAccessorProc)                                    \
  447.         (ODGetErrDescUPP)(theAccessorProc)
  448.  
  449. #define CallODPreDispatchProc(userRoutine, thePart, theODAppleEvent, reply, handlerRefcon)        \
  450.         (*(userRoutine))((thePart), (theODAppleEvent), (reply), (handlerRefcon))
  451. #define NewODPreDispatchProc(theHandlerProc)                                    \
  452.         (ODEventHandlerUPP)(theHandlerProc)
  453.  
  454. #define CallODTokenInquiryProc(userRoutine, token, refCon)        \
  455.         (*(userRoutine))((token), (refCon))
  456. #define NewODTokenInquiryProc(theAccessorProc)                                    \
  457.         (ODTokenInquiryUPP)(theAccessorProc)
  458.  
  459.  
  460. #define CallODDescCoercionHandlerProc(userRoutine, thePart, theODDesc, toType, handlerRefCon, result)        \
  461.         (*(userRoutine))((thePart), (theODDesc), (toType), (handlerRefCon), (result))
  462. #define NewODDescCoercionHandlerProc( theHandlerProc )                            \
  463.         (ODCoercionHandlerUPP)(theHandlerProc)
  464. #define CallODPtrCoercionHandlerProc(userRoutine, thePart, typeCode, dataPtr, dataSize, toType, handlerRefCon, result)        \
  465.         (*(userRoutine))((thePart), (typeCode), (dataPtr), (dataSize), (toType), (handlerRefCon), (result))
  466. #define NewODPtrCoercionHandlerProc( theHandlerProc )                            \
  467.         (ODCoercionHandlerUPP)(theHandlerProc)
  468.  
  469.  
  470. #endif        /* SIHELPER_USESROUTINEDESCRIPTORS */
  471.  
  472.  
  473. //==============================================================================
  474. // SIHelper
  475. //==============================================================================
  476.  
  477. #define ODNVMethod 
  478.  
  479. class SIHelper : public SIHelperAbs
  480. {
  481.   public:
  482.  
  483.     SIHelper();
  484.     ODVMethod ~SIHelper();
  485.     ODNVMethod void InitSIHelper(ODSession* session, ODSemanticInterface* helpee);
  486.  
  487.     // SIHelpAbs overrides
  488.         
  489.     ODVMethod ODError   CallEventHandler(
  490.             ODPart* thePart,
  491.             ODAppleEvent* theODAppleEvent,
  492.             ODAppleEvent* reply);
  493.     ODVMethod ODError   CallPredispatchProc(
  494.             ODPart* thePart,
  495.             ODAppleEvent* theODAppleEvent,
  496.             ODAppleEvent* reply);
  497.     ODVMethod ODError   CallCoercionHandler(
  498.             ODPart* thePart,
  499.             ODDesc* theODDesc,
  500.             ODDescType toType,
  501.             ODDesc* result);
  502.     ODVMethod ODError   CallObjectAccessor(
  503.             ODPart* thePart,
  504.             ODDescType desiredClass,
  505.             ODOSLToken* container,
  506.             ODDescType containerClass,
  507.             ODDescType form,
  508.             ODDesc* selectionData,
  509.             ODOSLToken* value);
  510.     ODVMethod ODError   CallCompareProc(
  511.         ODPart* thePart,
  512.         ODDescType oper,
  513.         ODOSLToken* obj1,
  514.         ODOSLToken* obj2,
  515.         ODBoolean* result);
  516.     ODVMethod ODError   CallCountProc(
  517.         ODPart* thePart,
  518.         ODDescType desiredType,
  519.         ODDescType containerClass,
  520.         ODOSLToken* container,
  521.         ODSLong* result);
  522.     ODVMethod ODError   CallDisposeTokenProc(
  523.         ODPart* thePart,
  524.         ODOSLToken* unneededToken);
  525.     ODVMethod ODError   CallGetErrDescProc(
  526.         ODPart* thePart,
  527.         ODDesc** errDesc);
  528.     ODVMethod ODError   CallGetMarkTokenProc(
  529.         ODPart* thePart,
  530.         ODOSLToken* dContainerToken,
  531.         ODDescType containerClass,
  532.         ODOSLToken* result);
  533.     ODVMethod ODError   CallMarkProc(
  534.         ODPart* thePart,
  535.         ODOSLToken* dToken,
  536.         ODOSLToken* markToken,
  537.         ODSLong index);
  538.     ODVMethod ODError   CallAdjustMarksProc(
  539.         ODPart* thePart,
  540.         ODSLong newStart,
  541.         ODSLong newStop,
  542.         ODOSLToken* markToken);
  543.  
  544.     // Object accessor management
  545.         
  546.     ODVMethod void        InstallObjectAccessor(ODDescType                desiredClass,
  547.                                                 ODDescType            containerType,
  548.                                                 ODObjectAccessorUPP    theAccessor,
  549.                                                 ODSLong            accessorRefcon);
  550.  
  551.     ODVMethod void        GetObjectAccessor(ODDescType                desiredClass,
  552.                                            ODDescType                containerType,
  553.                                            ODObjectAccessorUPP*    theAccessor,        // return parameter
  554.                                            ODSLong*            accessorRefcon);    // return parameter
  555.  
  556.     ODVMethod void            RemoveObjectAccessor(ODDescType            desiredClass,
  557.                                               ODDescType                containerType,
  558.                                               ODObjectAccessorUPP        theAccessor);
  559.  
  560.     // Special proc management
  561.  
  562.     ODVMethod void InstallCompareProc(ODCompareUPP    compareProc,
  563.                                             ODSLong        refCon);
  564.  
  565.     ODVMethod void InstallCountProc(ODCountUPP    countProc,
  566.                                             ODSLong    refCon);
  567.  
  568.     ODVMethod void InstallDisposeTokenProc(ODDisposeTokenUPP    disposeTokenProc,
  569.                                             ODSLong                    refCon);
  570.  
  571.     ODVMethod void InstallGetMarkTokenProc(ODGetMarkTokenUPP    getMarkTokenProc,
  572.                                                 ODSLong                refCon);
  573.  
  574.     ODVMethod void InstallMarkProc(ODMarkUPP    markProc,
  575.                                             ODSLong    refCon);
  576.  
  577.     ODVMethod void InstallAdjustMarksProc(ODAdjustMarksUPP    adjustMarksProc,
  578.                                             ODSLong                refCon);
  579.  
  580.     ODVMethod void InstallGetErrDescProc(ODGetErrDescUPP    errorDescProc,
  581.                                             ODSLong            refCon);
  582.  
  583.     ODVMethod void InstallTokenInquiryProc(ODTokenInquiryUPP    tokenInquiryProc,
  584.                                             ODSLong            refCon);
  585.  
  586.     // Event handler management
  587.  
  588.     ODVMethod void    InstallEventHandler(    ODEventClass            theAEEventClass,
  589.                                             ODEventID                theAEEventID,
  590.                                             ODEventHandlerUPP        handler,
  591.                                             ODSLong                    handlerRefcon);
  592.     
  593.     ODVMethod void    RemoveEventHandler(ODEventClass                    theAEEventClass,
  594.                                           ODEventID                    theAEEventID,
  595.                                           ODEventHandlerUPP    handler);
  596.     
  597.     ODVMethod void    GetEventHandler(ODEventClass                theAEEventClass,
  598.                                        ODEventID                theAEEventID,
  599.                                        ODEventHandlerUPP*        handler,
  600.                                        ODSLong*                handlerRefcon);
  601.     
  602.     ODVMethod void    InstallCoercionHandler(ODDescType                    fromType,
  603.                                               ODDescType                toType,
  604.                                               ODCoercionHandlerUPP    handler,
  605.                                               ODSLong                handlerRefcon,
  606.                                               ODBoolean            fromTypeIsDesc);
  607.     
  608.     ODVMethod void    RemoveCoercionHandler(ODDescType                fromType,
  609.                                              ODDescType            toType,
  610.                                              ODCoercionHandlerUPP    handler);
  611.     
  612.     ODVMethod void    GetCoercionHandler(ODDescType                    fromType,
  613.                                           ODDescType                toType,
  614.                                           ODCoercionHandlerUPP*    handler,
  615.                                           ODSLong*                handlerRefcon,
  616.                                           ODBoolean*            fromTypeIsDesc);
  617.     
  618.     ODVMethod void    InstallSpecialHandler(AEKeyword                    functionClass,
  619.                                                 ODSpecialHandlerUPP    handler,
  620.                                                 ODSLong                refCon);
  621.     
  622.     ODVMethod void    RemoveSpecialHandler(AEKeyword                    functionClass,
  623.                                                 ODSpecialHandlerUPP    handler);
  624.     
  625.     ODVMethod void    GetSpecialHandler(AEKeyword                    functionClass,
  626.                                             ODSpecialHandlerUPP*    handler,
  627.                                             ODSLong*                refCon);
  628.  
  629. //    ODVMethod void        SetOSLSupportFlags(short flags);
  630.  
  631. //    ODVMethod short    GetOSLSupportFlags();
  632.  
  633.   private: // Private by convention
  634.  
  635.     ODBoolean    LookupEventHandler(ODEventClass                eventClass,
  636.                                    ODEventID                eventID,
  637.                                    ODEventHandlerUPP*        handler,
  638.                                    ODSLong*                handlerRefcon);
  639.  
  640.     ODBoolean    LookupCoercionHandler(ODDescType                fromType,
  641.                                        ODDescType                toType,
  642.                                        ODCoercionHandlerUPP*    handler,
  643.                                        ODSLong*            handlerRefcon,
  644.                                        ODBoolean*            fromTypeIsDesc);
  645.  
  646.     ODBoolean    LookupObjectAccessor(ODDescType                desiredClass,
  647.                                        ODDescType                containerType,
  648.                                        ODObjectAccessorUPP*    theAccessor,
  649.                                        ODSLong*            accessorRefcon);
  650.  
  651.   private:
  652.  
  653.     void        ThrowProcNotFound(SIHashTable* table);
  654.     void        AddToTable(ODDescType key1, ODDescType key2, UniversalProcPtr handler,
  655.                                 ODSLong handlerRefCon,
  656.                                 ODBoolean fromTypeIsDesc,
  657.                                 SIHashTable* table);
  658.     void        RetrieveFromTable(ODDescType key1, ODDescType key2,
  659.                                             UniversalProcPtr* handler,
  660.                                             ODSLong* handlerRefCon,
  661.                                             ODBoolean* fromTypeIsDesc,
  662.                                             SIHashTable* table);
  663.     void        RemoveFromTable(ODDescType key1, ODDescType key2, UniversalProcPtr handler,
  664.                                     SIHashTable* table);
  665.     ODBoolean    HandlerLookup(
  666.                                 ODDescType        key1,
  667.                                 ODDescType        key2,
  668.                                 SIHashTable*    theSIHashTable,
  669.                                   void*            theValue);
  670.  
  671.     ODSemanticInterface*    fSemanticInterface;
  672.     ODNameResolver*            fNameResolver;
  673.  
  674.     SIHashTable*    fEventHandlerTable;
  675.     SIHashTable*    fObjectAccessorTable;
  676.     SIHashTable*    fCoercionHandlerTable;
  677.  
  678.         // Special Handler procs    
  679.     ODCountUPP             fCountProcPtr;
  680.     ODSLong                 fCountProcPtrRefCon;
  681.     ODCompareUPP        fCompareProcPtr;
  682.     ODSLong                 fCompareProcPtrRefCon;
  683.     ODDisposeTokenUPP     fDisposeTokenProcPtr;
  684.     ODSLong                 fDisposeTokenProcPtrRefCon;
  685.     ODGetErrDescUPP        fErrDescProcPtr;
  686.     ODSLong                 fErrDescProcPtrRefCon;
  687.     ODGetMarkTokenUPP     fGetMarkTokenProcPtr;
  688.     ODSLong                 fGetMarkTokenProcPtrRefCon;
  689.     ODMarkUPP             fMarkProcPtr;
  690.     ODSLong                 fMarkProcPtrRefCon;
  691.     ODAdjustMarksUPP     fAdjustMarksProcPtr;
  692.     ODSLong                 fAdjustMarksProcPtrRefCon;
  693.     ODPreDispatchUPP     fPreDispatchProcPtr;
  694.     ODSLong                 fPreDispatchProcPtrRefCon;
  695.  
  696.     ODTokenInquiryUPP     fTokenInquiryProc;
  697.     ODSLong                 fTokenInquiryProcRefCon;
  698.  
  699.     short                fOSLSupportFlags;
  700. };
  701.  
  702.  
  703. #endif /* _SIHELPER_ */
  704.